#include<stdio.h>
#include<Mesh_IO/Mesh_IO.h>
#include<tool/libcell_tools_formats.h>
#include<libcell_macros.h>
#include<tool/libcell_tools_algorithm.h>
void testread_array()
{
    Mesh mesh;
    Mesh_init(&mesh);

    double**V=(double**)malloc(sizeof(double*)*8);
    for(int i=0;i<8;i++)
    {
        V[i]=(double*)malloc(sizeof(double)*3);
    }

    V[0][0]=-0.500000;V[0][1]= -0.500000;V[0][2]=0.500000;

    V[1][0]=0.500000;V[1][1]=-0.500000;V[1][2]=0.500000;

    V[2][0]=-0.500000;V[2][1]=0.500000;V[2][2]=0.500000;

    V[3][0]=0.500000;V[3][1]=0.500000;V[3][2]=0.500000;

    V[4][0]=-0.500000;V[4][1]=0.500000;V[4][2]=-0.500000;

    V[5][0]=0.500000;V[5][1]=0.500000;V[5][2]=-0.500000;
    V[6][0]=-0.500000;V[6][1]=-0.500000;V[6][2]=-0.500000;
    V[7][0]=0.500000;V[7][1]=-0.500000;V[7][2]= -0.500000;

    int ** F=(int**)malloc(sizeof(int*)*24);
    for(int i=0;i<24;i++)
    {
        F[i]=(int*)malloc(sizeof(int)*3);
    }
    F[0][0]=2;F[0][1]=0;F[0][2]=1;
    F[1][0]= 2;F[1][1]= 1;F[1][2]= 3;
    F[2][0]= 2;F[2][1]= 3;F[2][2]= 2;
    F[3][0]= 2;F[3][1]= 2;F[3][2]= 0;
    F[4][0]= 2;F[4][1]= 2;F[4][2]= 3;
    F[5][0]= 2;F[5][1]= 3;F[5][2]= 5;
    F[6][0]= 2;F[6][1]= 5;F[7][2]= 4;
    F[7][0]= 2;F[7][1]= 4;F[7][2]= 2;
    F[8][0]= 2;F[8][1]= 4;F[8][2]= 5;
    F[9][0]= 2;F[9][1]= 5;F[9][2]= 7;
    F[10][0]= 2;F[10][1]= 7;F[10][2]= 6;
    F[11][0]= 2;F[11][1]= 6;F[11][2]= 4;
    F[12][0]= 2;F[12][1]= 6;F[12][2]= 7;
    F[13][0]= 2;F[13][1]= 7;F[13][2]= 1;
    F[14][0]= 2;F[14][1]= 1;F[14][2]= 0;
    F[15][0]= 2;F[15][1]= 0;F[15][2]= 6;
    F[16][0]= 2;F[16][1]= 1;F[16][2]= 7;
    F[17][0]= 2;F[17][1]= 7;F[17][2]= 5;
    F[18][0]= 2;F[18][1]= 5;F[18][2]= 3;
    F[19][0]= 2;F[19][1]= 3;F[19][2]= 1;
    F[20][0]= 2;F[20][1]= 6;F[20][2]= 0;
    F[21][0]= 2;F[21][1]= 0;F[21][2]= 2;
    F[22][0]= 2;F[22][1]= 2;F[22][2]= 4;
    F[23][0]= 2;F[23][1]= 4;F[23][2]= 6;
    int ** C=(int**)malloc(sizeof(int*)*6);
    for(int i=0;i<6;i++)
    {
        C[i]=(int*)malloc(sizeof(int)*5);
        C[i][0]=4;
        for(int j=0;j<4;j++)
        {
            C[i][j+1]=i*4+j;
        }
    } 
    int num[3]={8,24,6};
    //C[0][0]=4;C[0][1]=0;C[0][2]=1;C[0][3]=2;C[0][4]=3;
    _ReadArray_(&mesh,V,F,C,num,3,2);
    Mesh_free(&mesh);
    for(int i=0;i<8;i++)
    {
        free(V[i]);
    }
    free(V);
    for(int i=0;i<24;i++)
    {
        free(F[i]);
    }
    free(F);
    for(int i=0;i<6;i++)
    {
        free(C[i]);
    }
    free(C);


}
void testread_array1()
{
    double v[3*8]={0}; 
    v[0*3+0]=-0.500000;v[0*3+1]=-0.500000;v[0*3+2]=0.500000; 
    v[1*3+0]=0.500000; v[1*3+1]=-0.500000; v[1*3+2]=0.500000; 
    v[2*3+0]=-0.500000;v[2*3+1]= 0.500000;v[2*3+2] =0.500000; 
    v[3*3+0]=0.500000;v[3*3+1]=0.500000;v[3*3+2] =0.500000; 
    v[4*3+0]=-0.500000;v[4*3+1]= 0.500000;v[4*3+2]= -0.500000; 
    v[5*3+0]=0.500000;v[5*3+1]= 0.500000;v[5*3+2]= -0.500000; 
    v[6*3+0]=-0.500000;v[6*3+1]= -0.500000;v[6*3+2]= -0.500000; 
    v[7*3+0]=0.500000;v[7*3+1]= -0.500000;v[7*3+2]= -0.500000;
    int f[4*12]={0};
    f[0*4+0]=3; f[0*4+1]=3;f[0*4+2]=2;f[0*4+3]=1;
    f[1*4+0]=3; f[1*4+1]=1;f[1*4+2]=2;f[1*4+3]=0;
    f[2*4+0]=3; f[2*4+1]=5;f[2*4+2]=4;f[2*4+3]=3;
    f[3*4+0]=3; f[3*4+1]=3;f[3*4+2]=4;f[3*4+3]=2;
    f[4*4+0]=3; f[4*4+1]=7;f[4*4+2]=6;f[4*4+3]=5;
    f[5*4+0]=3; f[5*4+1]=5;f[5*4+2]=6;f[5*4+3]=4;
    f[6*4+0]=3; f[6*4+1]=1;f[6*4+2]=0;f[6*4+3]=7;
    f[7*4+0]=3; f[7*4+1]=7;f[7*4+2]=0;f[7*4+3]=6;
    f[8*4+0]=3; f[8*4+1]=5;f[8*4+2]=3;f[8*4+3]=7;
    f[9*4+0]=3; f[9*4+1]=7;f[9*4+2]=3;f[9*4+3]=1;
    f[10*4+0]=3; f[10*4+1]=2;f[10*4+2]=4;f[10*4+3]=0;
    f[11*4+0]=3;f[11*4+1]=0;f[11*4+2]=4;f[11*4+3]=6; 
    double**V=(double**)malloc(sizeof(double*)*8);
    for(int i=0;i<8;i++)
    {
        V[i]=(double*)malloc(sizeof(double)*3);
        for(int j=0;j<3;j++)
        {
            V[i][j]=v[i*3+j];
        }
    }    
    int **C=(int**)malloc(sizeof(int*)*12);
    for(int i=0;i<12;i++)
    {

        C[i]=(int*)malloc(sizeof(int)*4);
        for(int j=0;j<4;j++)
        {
            C[i][j]=f[i*4+j];
        }
    }
    int num[3]={8,0,12};
    Mesh mesh;
    Mesh_init(&mesh);
    _ReadArray_(&mesh,V,NULL,C,num,3,2);

    Mesh_free(&mesh); 


}

void test_line()
{
    double**V=(double**)malloc(sizeof(double*)*4);
    for(int i=0;i<4;i++)
    {
        V[i]=(double*)malloc(sizeof(double)*3);
        memset(V[i],0,sizeof(double)*3);
        V[i][0]=i;
    }     
    int **C=(int**)malloc(sizeof(int*)*3);
    for(int i=0;i<3;i++)
    {
        C[i]=(int*)malloc(sizeof(int)*3);
        C[i][0]=2;
        for(int j=0;j<2;j++)
        {
            C[i][j+1]=i+j;
        }
    }
    Mesh  mesh;
    Mesh_init(&mesh);
    int num[3]={4,0,3};
    _ReadArray_(&mesh,V,NULL,C,num,3,2);

     
    Mesh_free(&mesh);  


}
int main()
{


    //objtooff("bone_scan1.obj");

    testread_array(); 
    testread_array1();
    test_line();
    //objtooff("0831.obj");
    printf("end\n");
    return 0;
}